package br.com.sgi.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.sgi.autentication.UsuarioLogado;
import br.com.sgi.model.Authorities;
import br.com.sgi.model.Authority;
import br.com.sgi.model.Igreja;
import br.com.sgi.model.Users;
import br.com.sgi.model.UsersIgreja;
import br.com.sgi.service.AuthoritiesService;
import br.com.sgi.service.AuthorityService;
import br.com.sgi.service.IgrejaService;
import br.com.sgi.service.SistemaService;
import br.com.sgi.service.UsersIgrejaService;
import br.com.sgi.service.UsersService;
import br.com.sgi.util.Constante;
import br.com.sgi.util.Mensagem;
/**
 * 
 * @author lucas.costa
 *
 */
@Controller("usersCadastroBean")
@Scope("request")
public class UsersCadastroBean {
	
	private Users users;
	
	@Autowired
	private UsersService usersService;
	
	@Autowired
	private IgrejaService igrejaService;
	
	@Autowired
	private AuthoritiesService authoritiesService;
	
	@Autowired
	private AuthorityService authorityService;
	
	@Autowired
	private SistemaService serviceService;
	
	@Autowired
	private UsersIgrejaService usersIgrejaService;
	
	private List<UsersIgreja> listaUsersIgrejaCadastradas;
	
	private List<Authority> listaAuthority;
	
	private List<Igreja> listaIgrejas;
	
	private List <Users> listaUsers;
	
	private List<SelectItem> listaSelctItensIgrejas;
	
	protected List<Long> listaIgrejasSelecionadas;
	
	private List<String> listaSelctItensIgrejasSelecionada;
	
	
	private Authority authority;

	private boolean usersJaExiste(){
		boolean jaExiste = false;
		if(users != null)
			if(usersService.buscarUsersPorUsername(users.getUsername()) != null)
				jaExiste = true;
		
		return jaExiste;
	}
	
	public void salvar(){
		
		if(!usersJaExiste()){
			users.setPassword("1234");
			users.setEnabled(true);
			users.setSistema(serviceService.findById(UsuarioLogado.getCoSistema()));
			
			if(authority != null && authority.getAuthority().equals(Constante.ROLE_ADMIN_REGIONAL) && listaIgrejasSelecionadas.size() > 0){
				UsersIgreja usersIgreja = new UsersIgreja();
				List<UsersIgreja> listUsersIgrejas = new ArrayList<UsersIgreja>();
				for(Long id: listaIgrejasSelecionadas){
					usersIgreja = new UsersIgreja();
					usersIgreja.setIgreja(igrejaService.buscarIgrejaPorId(id));
					usersIgreja.setUsers(users);
					listUsersIgrejas.add(usersIgreja);
				}
				users.setIgrejasAutorizadas(listUsersIgrejas);
			}
			
			usersService.salvar(users);
			Authorities authorities = new Authorities();
			authorities.setUsername(users);
			authorities.setAuthority(authority.getAuthority());
			authoritiesService.salvar(authorities);
			
		}
		else
			Mensagem.errorMsg("erro.MSG_05");
		
		
		
	}
	
	/**
	 * select itens do pick liste
	 * @return
	 */
	public List<SelectItem> getListaSelctItensIgrejas() {
		List<Igreja> igrejas = igrejaService.buscarIgrejasPorCoSistema(UsuarioLogado.getCoSistema());
		if(listaSelctItensIgrejas == null){
			listaSelctItensIgrejas = new ArrayList<SelectItem>();
			for(Igreja igreja: igrejas){
				listaSelctItensIgrejas.add(new SelectItem(igreja.getCoSeqIgreja().toString(), igreja.getNome()));
			}
		}
		
		return listaSelctItensIgrejas;
	}

	public void setListaSelctItensIgrejas(List<SelectItem> listaSelctItensIgrejas) {
		this.listaSelctItensIgrejas = listaSelctItensIgrejas;
	}
	
	/**
	 * get ids das igrejas cadastradas ao usuario
	 * @return
	 */
	private List<Long> getListaIdsUsersIgrejaCadastradas(){
		List<Long> listaIds = new ArrayList<Long>();
		
		listaUsersIgrejaCadastradas = usersIgrejaService.buscarUsersIgrejaPorCoUsers(UsuarioLogado.getUsernameUsuarioLogado());
		if(listaUsersIgrejaCadastradas != null){
			for(UsersIgreja usersIgreja: listaUsersIgrejaCadastradas){
				listaIds.add(usersIgreja.getIgreja().getCoSeqIgreja());
			}
		}
		
		return listaIds;
	}
	
	public Users getUsers() {
		if(users == null)
			users = new Users();
		return users;
	}

	public void setUsers(Users users) {
		this.users = users;
	}

	
	public List<Authority> getListaAuthority() {
		if(listaAuthority == null)
			listaAuthority = authorityService.buscarTodasAuthority();
		return listaAuthority;
	}

	public void setListaAuthority(List<Authority> listaAuthority) {
		this.listaAuthority = listaAuthority;
	}

	public List<Igreja> getListaIgrejas() {
		if(listaIgrejas == null)
			listaIgrejas = igrejaService.buscarIgrejasPorCoSistema(UsuarioLogado.getCoSistema());
		return listaIgrejas;
	}

	public void setListaIgrejas(List<Igreja> listaIgrejas) {
		this.listaIgrejas = listaIgrejas;
	}

	/**
	 * lista com ids das igrejas cadastradas a um usuÃ¡rio
	 * @return
	 */
	public List<Long> getListaIgrejasSelecionadas() {
		if(listaIgrejasSelecionadas == null)
			listaIgrejasSelecionadas = getListaIdsUsersIgrejaCadastradas() != null? getListaIdsUsersIgrejaCadastradas(): new ArrayList<Long>();
		return listaIgrejasSelecionadas;
	}

	public void setListaIgrejasSelecionadas(List<Long> listaIgrejasSelecionadas) {
		this.listaIgrejasSelecionadas = listaIgrejasSelecionadas;
	}

	public List<Users> getListaUsers() {
		if(listaUsers == null)
			listaUsers = usersService.buscarUsersPorCoSistema(UsuarioLogado.getCoSistema());
		return listaUsers;
	}

	public void setListaUsers(List<Users> listaUsers) {
		this.listaUsers = listaUsers;
	}

	public Authority getAuthority() {
		return authority;
	}

	public void setAuthority(Authority authority) {
		this.authority = authority;
	}

	public List<String> getListaSelctItensIgrejasSelecionada() {
		return listaSelctItensIgrejasSelecionada;
	}

	public void setListaSelctItensIgrejasSelecionada(
			List<String> listaSelctItensIgrejasSelecionada) {
		this.listaSelctItensIgrejasSelecionada = listaSelctItensIgrejasSelecionada;
	}



}
